关于指针的输出cout<<p的提问

来源:百度知道 编辑:UC知道 时间:2024/05/10 19:42:11
#include<iostream>
using namespace std;
void main(){
int *p=new int(10);
cout<<p<<endl;
cout<<&p<<endl;
delete[] p;
p=NULL;

}
代码如上,输出如下:
00371C28
0012FF7C

第二行是指针地址大家都知道,第一行到底是什么东东~
求高手答~
#include<iostream>
using namespace std;
void main(){
char *p=new char[10];
*p='a';
cout<<p<<endl;
cout<<&p<<endl;
delete[] p;
p=NULL;
}

把整数指针P改为字符指针之后,
这个第一行输出莫名其妙的字符,第二行输出正常地址。何解?

其实楼上几位说的没有问题,希望我能讲得清楚些。

------------

int *p=new int(10);

声明一个整型指针变量p,该变量所指向的整型值初始化为10。

此时的内存空间是类似这样的:

内存地址 值
[0x00371C28] 0A 00 00 00 // 0x0A就是十进制的10
……
[0x0012FF7C] 28 1C 37 00 // 这里的00371c28就是p的值,0x0012ff7c才是p这个变量存放的地址。

虽然我们说p是指针,但更明确的说法应该是“指针变量”,因此p这个变量本身也有地址。

这个例子中,p的值是0x00371c28,其地址为0x0012ff7c。

---------------

char *p=new char[10];
*p='a';

声明一个长度为10个字符的字符数组p,初始化数组首字符为'a'。

cout<<p<<endl;

注意,由于这里没有给数组加上结束符“\0”,因此cout在输出时,将从p指向的空间开始扫描并打印字符,直到遇到'\0'为止。由于这段空间未被初始化,因此输出的是乱码。

如果不希望出现乱码,可以在初始化的时候加上类似p[1]='\0'或者p[9]='\0'之类的语句,来设置字符串的结束位。

第一行 是指针指向的地址
第二行 是指针本身的地址

第一行是指针指向的那片区域的地址,也就是那10个整数的首地址的值。
第二行是存放这个指针的内存区域地址的值。

第一个cout<<P输出的是P所指向的空间的所有内容,也就是你分配的空间的内容,
当你没给他初始化时肯定是乱码啊;你给P赋值a字符时,后面还有9个空间没初始话,后面的都是乱码
第二个就是指针地址